package main.leetcode.competition.weeklycomp.competition180;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 5357.设计一个支持增量操作的栈
 *
 * <p>请你设计一个支持下述操作的栈。
 *
 * <p>实现自定义栈类 CustomStack ：
 *
 * <p>CustomStack(int maxSize)：用 maxSize 初始化对象，maxSize 是栈中最多能容纳的元素数量，栈在增长到 maxSize 之后则不支持 push 操作。
 * void push(int x)：如果栈还未增长到 maxSize ，就将 x 添加到栈顶。 int pop()：返回栈顶的值，或栈为空时返回 -1 。 void inc(int k, int
 * val)：栈底的 k 个元素的值都增加 val 。如果栈中元素总数小于 k ，则栈中的所有元素都增加 val 。
 *
 * <p>提示：
 *
 * <p>1 <= maxSize <= 1000 1 <= x <= 1000 1 <= k <= 1000 0 <= val <= 100 每种方法 increment，push 以及 pop
 * 分别最多调用 1000 次
 */
public class Solution2 {
    private int maxSize;
    //    private Deque<Integer> queue;
    private Queue<Integer> queue;
    public Solution2(int maxSize) {
        this.maxSize = maxSize;
        queue = new LinkedList<>();
    }

    public static void main(String[] args) {
        Solution2 customStack = new Solution2(3);
        customStack.push(1); // 栈变为 [1]
        customStack.push(2); // 栈变为 [1, 2]
        System.out.println(customStack.pop());
        customStack.push(2); // 栈变为 [1, 2]
        customStack.push(3); // 栈变为 [1, 2, 3]
        customStack.push(4); // 栈仍然是 [1, 2, 3]，不能添加其他元素使栈大小变为 4
        customStack.increment(5, 100); // 栈变为 [101, 102, 103]
        customStack.increment(2, 100); // 栈变为 [201, 202, 103]
        System.out.println(customStack.pop());
        System.out.println(customStack.pop());
        System.out.println(customStack.pop());
        System.out.println(customStack.pop());
    }

    public void push(int x) {
        if (queue.size() == maxSize) return;
        queue.add(x);
    }

    public int pop() {
        if (queue.isEmpty()) return -1;
        return queue.poll();
    }

    public void increment(int k, int val) {
        int size = queue.size();
        for (int i = 0; i < size; i++) {
            if (i >= size - k) queue.add(queue.remove() + val);
            else queue.add(queue.poll());
        }
    }
}
